from datetime import datetime

'''
功能：
判断给定日期是工作日还是休息日，考虑了双休和法定假日
每年要更新国务院的休假通知
'''
"2019-2021年休假安排"

# 休：正常工作日(周一至周五)放假日期
holidays_exception = [
    '20190101',  # 元旦,周二
    '20190204',  # 以下为春节
    '20190205',  #
    '20190206',  #
    '20190207',  #
    '20190208',  #
    '20190405',  # 清明
    '20190501',  # 劳动节
    '20190502',  #
    '20190503',  #
    '20190607',  # 端午节连休放假
    '20190913',  # 中秋节休
    '20191001',  # 国庆放假
    '20191002',  #
    '20191003',  #
    '20191004',  #
    '20191007',  #
    '20200101',  # 元旦,周三
    '20200122',  # 公司提前放假
    '20200123',  # 公司提前放假
    '20200124',  # 除夕,周五
    '20200127',  # 春节,周一
    '20200128',  # 春节
    '20200129',  # 春节
    '20200130',  # 春节,周四
    '20200131',  # 新冠病毒国务院放假
    '20200201',  # 新冠病毒国务院放假
    '20200406',  # 清明,周一
    '20200501',  # 劳动节,周五
    '20200504',  # 劳动节,周一
    '20200505',  # 劳动节,周二
    '20200625',  # 端午,周二
    '20200626',  # 端午,周二
    '20201001',  # 国庆,周四
    '20201002',  # 国庆,周五
    '20201005',  # 国庆,周一
    '20201006',  # 国庆,周二
    '20201007',  # 国庆,周三
    '20201008',  # 国庆,周四
    '20210101',  # 元旦,周五 2021 年开始
    '20210211',  # 除夕,周四
    '20210212',  # 春节,周五
    '20210215',  # 春节,周一
    '20210216',  # 春节,周二
    '20210217',  # 春节,周三
    '20210405',  # 清明,周一
    '20210503',  # 五一,周一
    '20210504',  # 五一,周二
    '20210505',  # 五一,周三
    '20210614',  # 端午调休,周一
    '20210920',  # 中秋调休,周一
    '20210921',  # 中秋调休,周二
    '20211001',  # 国庆调休,周五
    '20211004',  # 国庆调休,周一
    '20211005',  # 国庆调休,周二
    '20211006',  # 国庆调休,周三
    '20211007',  # 国庆调休,周四
]

# 班：正常周末(周六和周五)上班日期
workdays_exception = [
    '20190202'  # 春节前调休周末上班
    '20190203'
    '20190505'  # 劳动节调休周末上班
    '20200201',  # 春节, 周六
    '20200426',  # 劳动节, 周日
    '20200509',  # 劳动节, 周六
    '20200628',  # 端午, 周日
    '20200927',  # 国庆,周六
    '20201010',  # 国庆,周六
    '20210207',  # 春节前调休,周日，2021年开始
    '20210220',  # 春节后调休，周六
    '20210425',  # 五一调休,周日
    '20210508',  # 五一调休,周六
    '20210918',  # 中秋调休,周六
    '20210926',  # 中秋调休,周日
    '20211009',  # 国庆调休,周日
]
def is_work(day=None):
    day=day or datetime.today()# 没有给参数则默认为今天
    week_day=datetime.weekday(day)+1
    #获取星期几
    is_work_day_in_week=week_day in range(1,6)
    # 判断是否周末
    day_str=f'{str(day.year).zfill(4)}{str(day.month).zfill(2)}{str(day.day).zfill(2)}'
    # 将日期改写为yyyymmdd的字符串
    if day_str in workdays_exception: # 补办
        return True
    elif day_str in holidays_exception: # 调休
        return False
    elif is_work_day_in_week: # 周一到周五
        return True
    else: # 普通周末
        return False

def is_holiday(day=None):
    day=day or datetime.today() # 没有给参数则默认为今天
    if is_work(day):
        return False
    else:
        return True